From 293dfc0ac29d6b6980199ccca3f61cb4fe2e7457 Mon Sep 17 00:00:00 2001 From: "emellor@ewan" Date: Wed, 5 Oct 2005 14:38:19 +0100 Subject: [PATCH] Recover from name uniqueness violation by renaming. Fixes bug #277. Signed-off-by: Ewan Mellor --- tools/python/xen/xend/XendDomain.py | 10 ++++++---- tools/python/xen/xend/XendDomainInfo.py | 20 ++++++++++++++++++-- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/tools/python/xen/xend/XendDomain.py b/tools/python/xen/xend/XendDomain.py index 5ee74977a5..b109ef69f2 100644 --- a/tools/python/xen/xend/XendDomain.py +++ b/tools/python/xen/xend/XendDomain.py @@ -309,10 +309,12 @@ class XendDomain: if n == 1: return matching[0] elif n > 1: - raise XendError( - 'Name uniqueness has been violated for name %s' % name) - else: - return None + log.error('Name uniqueness has been violated for name %s! ' + 'Recovering by renaming:', name) + for d in matching: + d.renameUniquely() + + return None finally: self.domains_lock.release() diff --git a/tools/python/xen/xend/XendDomainInfo.py b/tools/python/xen/xend/XendDomainInfo.py index 782a1b7d68..21d72f48ff 100644 --- a/tools/python/xen/xend/XendDomainInfo.py +++ b/tools/python/xen/xend/XendDomainInfo.py @@ -1288,7 +1288,7 @@ class XendDomainInfo: preserving the restart semantics (name and UUID preserved). """ - new_name = self.generateShutdownName() + new_name = self.generateUniqueName() new_uuid = getUuid() log.info("Renaming dead domain %s (%d, %s) to %s (%s).", self.info['name'], self.domid, self.uuid, new_name, new_uuid) @@ -1307,7 +1307,23 @@ class XendDomainInfo: self.state_set(STATE_VM_TERMINATED) - def generateShutdownName(self): + ## public: + + def renameUniquely(self): + """Rename this domain so that it has a unique name. This is used by + XendDomain to recover from non-uniqueness errors; we should never have + allowed the system to reach this state in the first place.""" + new_name = self.generateUniqueName() + + log.error('Renaming %s (%d, %s) to %s', self.info['name'], self.domid, + self.uuid, new_name) + + self.setName(new_name) + + + # private: + + def generateUniqueName(self): n = 1 while True: name = "%s-%d" % (self.info['name'], n) -- 2.30.2